import { http } from '@/uni_modules/uview-plus';
import { HttpRequestConfig, HttpResponse } from '@/uni_modules/uview-plus/libs/luch-request';
import {clearToken, getToken} from '@/utils/auth';
import global from '@/global';
import {pages} from '@/utils/page-url';

export interface AjaxResult {
	code: number,
	data: any,
	msg: string
}

const requestInterceptors = (vm : any) => {
	// 请求拦截器
	http.interceptors.request.use((config : any) => {
		// 
		config.header = { ...config.header }
		// 是否需要携带token
		// @ts-ignore
		if (config.custom.auth) {
			const token = getToken();
			// 如果token不存在，return Promise.reject(config) 会取消本次请求
			if (!token) {
				// @ts-ignore
				uni.$u.route({
					type: 'reLaunch',
					url: pages.login
				});
				return Promise.reject("未登录");
			}
			// @ts-ignore
			config.header['Authorization'] = 'Bearer ' + getToken()
		}
		return config;
	}, (config : any) => {
		// 可使用async await 做异步操作
		return Promise.reject(config);
	});
}

const responseInterceptors = (vm : any) => {
	// 响应拦截器
	// @ts-ignore
	http.interceptors.response.use((response : HttpResponse<AjaxResult>) => {
		/* 对响应成功做点什么 可使用async await 做异步操作*/

		const data = response.data;
		if (data.code === 50001) {
			// 未登录
			if (global.loginAuth) {
				clearToken();
				// @ts-ignore
				uni.$u.route({
					type: 'reLaunch',
					url: pages.login
				});
			} else {
				// @ts-ignore
				uni.$u.route({
					type: 'to',
					url: pages.login
				});
			}
			return Promise.reject('50001未登录');
		} else if (data.code === 50009) {
			return Promise.reject('50009会话超时，请重新登录');
		} else if (data.code !== 200) {
			// 请求成功，但有提示
			uni.showToast({
				title: data.msg,
				icon: "none",
				duration: 1500
			})
		}
		return response.data;
	}, (response : HttpResponse) => {
		/*  对响应错误做点什么 （statusCode !== 200）*/
		console.log(response);
		const statusCode = response.statusCode;
		if (statusCode === 401) {
			// 未登录
			if (global.loginAuth) {
				// @ts-ignore
				uni.$u.route({
					type: 'reLaunch',
					url: pages.login
				});
			} else {
				// @ts-ignore
				uni.$u.route({
					type: 'to',
					url: pages.login
				});
			}
		} else if (statusCode === 404) {
			// 页面不存在
			uni.showToast({
				title: '页面不存在',
				icon: "none",
				duration: 1500
			})
		} else if (statusCode === 500) {
			// 服务器异常
			uni.showToast({
				title: '请求异常，请联系管理员',
				icon: "none",
				duration: 1500
			})
		} else {
			// 其他错误
			uni.showToast({
				title: response.errMsg,
				icon: "none",
				duration: 1500
			})
			if (getToken() && !global.loginAuth) {
				clearToken()
			}
		}

		return Promise.reject();
	});
}

// http请求全局配置
export const initRequest = (vm : any) : void => {

	// 全局配置设置
	http.setConfig((config : HttpRequestConfig) => {
		// 基础地址
		config.baseURL = global.baseUrl;
		// 请求是否需要权限
		// @ts-ignore
		config.custom = { auth: true };
		return config;
	});

	// 请求拦截器
	requestInterceptors(vm);
	// 响应拦截器
	responseInterceptors(vm);
}
